在說明 Shell 是什麼之前,我們先來談談什麼是直譯式語言,懂了之後會更容易理解 Shell 所扮演的角色
程式語言大致上可以分為 編譯式 跟 直譯式 兩種,編譯式語言需要把程式碼編譯成執行檔才能執行,C/C++ 跟 Go 屬於這類;而直譯式語言不用經過編譯,而是直接由直譯器一句一句執行程式碼,你給他什麼指令他就馬上執行,Python 跟 JavaScript 屬於此類
以下面這個 Python 的例子來說,一開始執行的 python
就是 Python 語言的直譯器 ,在直譯器裡輸入一行指令,它就馬上幫你執行,如果你的輸入不符合 Python 語法,他就會噴錯
所以我們可以說「 python
這個程式是 Python 語言的 直譯器 ,他能看懂 Python 的語法」
聰明的你應該猜到我要說什麼了吧:我們平常在終端機下的指令像是 rm file
、echo Hello
用的就是 Shell Script 的語法,而 Shell 會負責處理這些指令,所以我們可以說「Shell 就是 Shell Script 的 直譯器 ,他能看懂 Shell Script 的語法」
另外,大部分的 Shell 都會有像這樣的輸入介面稱作 prompt,通常會包含你的使用者名稱跟你所在的資料夾,看到那個游標在那邊就會有種很想輸入指令的感覺對吧(?),所以也可以說 Shell 會負責呈現一個可以讓你輸入指令的介面
就像在 Day 1 中提到的,比較廣為使用的 Shell 有 bash、zsh 跟 fish 幾種,因為說穿了,Shell 就是能看懂 Shell Script 語法的程式而已,所以只要你知道 Shell Script 的語法,你就可以自己寫出一個 Shell
ls
指令時發生了什麼事?首先 Shell 會收到你下的指令 ls
,接著他就會去找一個叫做 ls
的執行檔,這個執行檔放在 /bin
裡面,只要到裡面看一下就會看到 ls
這個執行檔,包括常用的 cp
, mv
, rm
等等指令也都是以執行檔的樣子放在裡面
所以 你下的指令其實是執行某個執行檔 ,這些常用的執行檔(指令)系統已經幫你裝好了
/bin
去找執行檔因為系統裡面有一個環境變數 PATH
記錄了執行檔放在哪些地方,以我的電腦來說 PATH
長得像這樣 /usr/local/bin:/usr/bin:/bin:...
,以冒號作為分隔點可以隔出很多個路徑 [/usr/local/bin, /usr/bin, /bin, ...]
當你下 ls
指令時,Shell 就會照順序尋找 ls
這個執行檔,先到 /usr/local/bin
找找看有沒有 ls
,沒有的話就再往 /usr/bin
找,就這樣一直找下去,如果在某個地方找到了就執行它,若是都沒找到就跟你說 command not found
講完 Shell 了之後順便說說一個跟他很像的東西:Terminal(終端機),有很多人都會搞混終 Terminal 跟 Shell,甚至誤以為 Terminal 跟 Shell 是同一個東西,反正就是那個黑底白字會出現在電影裡的畫面XDD
其實 Terminal 只是用來跟 Shell 互動的工具而已,他們兩個是合作的關係:
當我下指令 ls
並按下 Enter 時,Terminal 會負責把 ls
這個字串傳送給 Shell 執行,Shell 執行完會把 純文字 的結果回覆給 Terminal,Terminal 再根據字型、字體大小等等樣式把結果呈現出來
下面我們來比較三款 Terminal,從左到右依序是 iTerm2、內建 Terminal 跟 Hyper,我在三個 Terminal 裡面都下了一樣的指令 ls -la
就像上面提到的,因為文字部分是由 Shell 執行指令後產生的結果,所以可以看到三個 Terminal 內的文字內容一模一樣;但在樣式方面可就差得多了,因為每個終端機有他預設的背景顏色、字型、間距等等,差距非常大
所以可以知道其實 Terminal 就是負責把 Shell 執行的結果呈現出來而已,而真的執行指令是 Shell 的任務,跟 Terminal 一點關係都沒有
大家看完今天有沒有更了解 Shell 跟 Terminal 呢?如果有什麼問題歡在下面留言,沒問題的話明天就要正式開工囉~